package com.chenziwen.scala.chapter05

import java.util

import scala.collection.mutable
import scala.collection.mutable.HashMap

/**
  * 包可见性
  * 在Java中，访问权限分为4中：private(当前类)、缺省(当前类，同一个包下的类)、protected(当前类，同一个包下的类，子类)、public(所有)
  * 在Scala中，你可以通过类似的修饰符达到同样的效果。但是使用上有区别
  */
object Scala07_AccessPermission {

  def main(args: Array[String]): Unit = {
    val male = new Male()
    println(male.name)


    val female = new Female()
    //println(female.age)
    Female.test()


  }

}


class Male {
  // 不加任何修饰符，此属性为public访问权限，任何地方都能访问
  var name = "zhangsan"
}

class Female {
  // 此属性为私有的，只能在类的内部和伴生对象中访问
  private var age = 18
}

object Female {
  def test(): Unit = {
    val female = new Female()
    println(female.age)
  }
}

class Fish {
  // Scala中受保护权限比Java中更严格，只能子类访问，同包下的类无法访问
  protected var name = "xiaoqi"
}

class GoldFish extends Fish {
  def test: Unit = {
    val bird = new Bird()
    println("访问父类中受保护权限的资源：" + name + bird.name)
  }
}

class Bird {
  // 增加包访问权限后（不一定是所在的包，也可以是其它的包），同时private也起作用
  private[chapter05] val name = "xiaoxiao"
  // 当然，也可将可见度延展到上层包
  private[chenziwen] val age = "xiaoxiao"

  def test: Unit = {
    // 如果不想要某个包中全部的类，而是其中的几个类，可以采用选取器（大括号）
    import scala.collection.mutable.{HashMap, HashSet}
    var map = new HashMap()
    var set = new HashSet()

    // 重命名和隐藏
    // 如果引入的多个包中含有相同的类，那么可以将不需要的类进行重命名进行区分
    //重命名：
    import java.util.{HashMap => JavaHashMap}
    val javaHashMap = new JavaHashMap()


  }

  def test2: Unit = {
    // 隐藏：
    // 如果某个冲突的类根本就不会用到，那么这个类可以直接隐藏掉
    // 此处第一个下划线表示隐藏前面的HashMap，后面的下划线表示星号
    import java.util.{HashMap => _, _}
    // 此时的HashMap指向的是scala中的HashMap
    var map = new HashMap()
  }
}